Pointer to Member Function

function pointer是知道的, 如

int max( int a, int b) { ... };

int (*pFtor)( int, int ) = &max;
int iResult = pFtor(1, 2); 

or

typedef int(*FtorType)(int, int); 
FtorType pFtor; 
pFtor = &max;
int iResult = pFtor(1, 2);

但是当看到类似以下代码时候还是恐惧了一下:

class Tool {
    int doA(ArgumentType &);
    int doB(ArgumentType &); 
}; 
typedef int(Tool::*MemberFunctionPtr)(ArgumentType &);


Tool toolObj;
MemberFunctionPtr pFtorA = &Tool::doA; 
MemberFunctionPtr pFtorB = &Tool::doB; 

int iResultA = (toolObj.*pFtorA)(argumentList); 
int iResultB = (toolObj.*pFtorB)(argumentList); 

or
Tool *pToolObj;
int iResultA = (pToolObj->*pFtorA)(argumentList); 

Google了一下,原来是pointer to member function. 一般pointer是指向一个obsolete address, 但是这个pointer to member function, 像是指向一个类class里面的偏移地址offset而已。给出一个对象(知道类的类型),+这个offset, 推导出具体是某个函数?

更复杂的情况,也是更常用的情况是引入Tool的子类derived class;

class ToolX {
    // override doA and doB functions;
};
class ToolY {
    // override doA and doB functions;
};

ToolX toolXObj;
ToolY toolYObj; 
MemberFunctionPtr pFtorA = &Tool::doA; 
MemberFunctionPtr pFtorB = &Tool::doB; 

int iResultXA = (toolObjX.*pFtorA)(argumentList);  // ? 是调用了member func from base class or derived class呢? 
int iResultYA = (toolObjY.*pFtorA)(argumentList);  // ?

OK,简单知道了有这样的技术以后,那么, 这种技术有什么用呢? Function pointer貌似很多情况下都是用于作为回调函数callback function, 目的是灵活. 这种pointer to member function也可以这么用。

typedef int(Tool::*MemberFunctionPtr)(ArgumentType &);

class Tool {

    ToolCallback *buildToolClassback() {
        ToolCallback *callback(*this, &Tool::doA);
        return callback;
    }

    int doA(ArgumentType &);
    int doB(ArgumentType &); 
}; 

class ToolCallback {
    ToolCallback( Tool &_toolObj, MemberFunctionPtr _p) 
    : toolObj(_toolObj), pFtor(_p) {}

    int do(ArgumentType) { (toolObj.*pFtor)( argument ); }

    Tool &toolObj;              // 组成1: an object;
    MemberFunctionPtr pFtor;    // 组成2: on offset; 
}; 

// 后面我们就可以把ToolCallback *callback在代码里面传来传去, 
// 最后我们想执行这个东西了, 那就
callback->do(argument);